package offer2

/*
*
原题链接:
https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/description/

剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。

比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1：
输入: s = "abcdefg", k = 2
输出: "cdefgab"

示例 2：
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
*/
func reverseLeftWords(s string, n int) string {

	length := len(s)   // 1. 获取字符串的长度
	chars := []rune(s) // 2. 把字符串转换为字符数组的形式

	reverse(chars, 0, length-1)        // 3. 把字符数组的所有字符反转
	reverse(chars, 0, length-n-1)      // 4. 再反转前 length-n 个字符
	reverse(chars, length-n, length-1) // 5. 再反转剩余的字符

	return string(chars)
}

// 借助临时变量的方法，把字符数组进行反转
func reverse(chars []rune, left int, right int) {

	for left < right { // 定义一个临时变量用来保存字符数组的开始字符
		temp := chars[left]

		chars[left] = chars[right] // 将首尾字符交换
		chars[right] = temp        // 将首尾字符交换

		left++ // 继续交换剩下的字符
		right--
	}
}
